Q: ナビゲーションダイアログのカスタム領域にある Edit Text ボックスが 10.3 で動作しないのはなぜでしょうか。 A: Navigation Services ダイアログは、Mac OS X 10.3 になって複合化されました。NavCustomControl / kNavCtlAddControl 呼び出しで、ダイアログのコントロールリスト内にコントロールまたは HIVIew を追加(また移動)できるようになりました。これまでは、コントロールがコントロールリスト内にあらかじめ入っている必要がありました。
バグ(修正予定)により、この NavCustomControl 呼び出しが、Edit Text コントロールがコントロールリスト内にすでにあった場合に、コントロールの処理を誤ります。その結果として生じる現象は、作成時に文字列を指定しても空のボックスが表示され、そのエディットボックスにフォーカスが設定されても文字の入力を受け付けないというものです。このバグには簡単な回避策があります。以下に示します。
以前に正しく動作していた次のようなコードがあったとします。
リスト 1. 以前のコード。
|
CreateEditUnicodeTextControl(callBackParms->window, &bounds,
CFSTR("Some Text"), false, NULL, &editText);
NavCustomControl(callBackParms->context, kNavCtlAddControl, editText);
|
Mac OS X 10.3 では、これを次のように変更する必要があります。
リスト 2. 新しいコード。
|
CreateEditUnicodeTextControl(NULL, &bounds,
CFSTR("Some Text"), false, NULL, &editText);
NavCustomControl(callBackParms->context, kNavCtlAddControl, editText);
|
次のように、バージョン検査を追加することもできます。
リスト 3. HIToolbox のバージョンの確認。
|
WindowRef inWindow;
if (GetHIToolboxVersion() < 0x130)
inWindow = callBackParms->window;
else
inWindow = NULL;
CreateEditUnicodeTextControl(inWindow, &bounds,
CFSTR("Some Text"), false, NULL, &editText);
|
HIToolbox のバージョンを取得するには、次のコードを使用できます。
リスト 4. HIToolbox のバージョンの取得。
|
UInt32 GetHIToolboxVersion()
{
CFBundleRef bundle;
CFStringRef versStr = NULL;
static UInt32 version = 0;
// 次の負荷の高いコードは一度だけ実行する ...
if (version != 0) return version;
bundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.HIToolbox"));
if ( bundle != NULL )
versStr = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(bundle,
CFSTR("CFBundleShortVersionString"));
if ( versStr != NULL &&
CFGetTypeID(versStr) == CFStringGetTypeID())
{
int major = 0, minor = 0, bugfix = 0;
char sz[20];
CFStringGetCString(versStr, sz, sizeof(sz), kCFStringEncodingUTF8);
sscanf(sz, "%d.%d.%d", &major, &minor, &bugfix);
version = ( major << 8 ) + ( minor << 4 ) + bugfix;
}
return version;
}
|
バグが修正され、CreateEditUnicodeTextControl 呼び出しの第 1 引数として callBackParms->window が使用できるようになった場合でも、第 1 引数として NULL を渡す回避策は、Mac OS X 10.3 以降で期待どおりに動作します。
[2003 年 10 月 28 日]
|